#ifndef BINARYPROTOCOLGENERATOR_H
#define BINARYPROTOCOLGENERATOR_H

#include <QObject>
#include <QByteArray>
#include <QVariantMap>

class BinaryProtocolGenerator : public QObject {
    Q_OBJECT
    Q_PROPERTY(QString className READ className CONSTANT)
    Q_INVOKABLE QString className() const { return "BinaryProtocolGenerator"; }

public:
    explicit BinaryProtocolGenerator(QObject *parent = nullptr);

    // 生成二进制协议指令
    QByteArray generateCommand(const QVariantMap &protocolConfig, const QVariantMap &params);

private:
    /**
     * @brief 计算校验和
     * @param data 要计算校验和的数据
     * @param checksumType 校验和类型 (0: 求和校验, 1: CRC16, 2: 位级别异或)
     * @return 计算得到的校验和
     */
    quint16 calculateChecksum(const QByteArray &data, int checksumType);

    /**
     * @brief 从配置生成协议
     * @param params 命令参数
     * @param config 协议配置
     * @return 生成的协议数据
     */
    QByteArray generateProtocolFromConfig(const QVariantMap &params, const QVariantMap &config);

    /**
     * @brief 将值写入数据流
     * @param stream 目标数据流
     * @param value 要写入的值
     * @param length 数据长度
     */
    void writeValueToStream(QDataStream &stream, const QVariant &value, int length);


};

#endif // BINARYPROTOCOLGENERATOR_H
